/*
 *
 *  Copyright (C) 2012-2024
 *  All rights reserved, Designed By 杭州连线客信息技术有限公司
 *  注意：
 *  本软件为杭州连线客信息技术有限公司开发研制，未经购买不得使用
 *  购买后可获得全部源代码（禁止转卖、分享、上传到码云、github等开源平台）
 *  一经发现盗用、分享等行为，将追究法律责任，后果自负
 *
 */

package org.dromara.common.core.utils;

import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 枚举工具类
 *
 * @author heyi
 * 2024/8/15
 */
@Slf4j
public class EnumUtils {

    /**
     * 获取这个类型下的枚举类
     *
     * @param interfaceClass
     * @return
     */
    public static List<Class> getEnumClasses(Class<?> interfaceClass) {
        List<Class> enumClasses = new ArrayList<>();
        Class[] innerClasses = interfaceClass.getDeclaredClasses();
        for (Class innerClass : innerClasses) {
            if (innerClass.isEnum()) {
                enumClasses.add(innerClass);
            }
        }
        return enumClasses;
    }

    /**
     * 获取改类型下面的所有枚举类的枚举值
     *
     * @param tClass
     * @param <R>
     * @return
     */
    public static <R> Set<R> getAllEnumsValue(Class<?> tClass) {
        Set<R> result = new HashSet<>();
        List<Class> enumClasses = getEnumClasses(tClass);
        for (Class enumClass : enumClasses) {
            Field[] fields = enumClass.getFields();
            for (Field field : fields) {
                Object[] enumValues = field.getType().getEnumConstants();
                if (ObjectUtil.isNotEmpty(enumValues)) {
                    Set<R> collect = Arrays.stream(enumValues).map(item -> (R) item).collect(Collectors.toSet());
                    result.addAll(collect);
                    break;
                }
            }
        }
        return result;
    }
}
